<?php
	// $this->start('css');
 //        echo $this->Html->css('jquery-ui/jquery-ui-1.10.3.custom.min');
 //        //echo $this->Html->css('Index/index');        
 //        echo $this->Html->css('jquery.ui.timepicker');
 //    $this->end();
 //    $this->start('script');
	// 	echo $this->Html->script("jquery-1.10.2.min");
 //        echo $this->Html->script("jquery-ui-1.10.3.custom.min");
 //        echo $this->Html->script(array(
 //            "jquery.dataTables.min", 
 //            "jquery.ui.timepicker.min", 
 //            ));
 //        //echo $this->Html->script("http://js.cit.api.here.com/se/2.5.3/jsl.js?with=all");        
	// 	//echo $this->Html->script("prediccion_mapas");
	// 	//echo $this->Html->script("prediccion_ruta");
 //    $this->end();
    $this->assign('title', "Mostrar Coordenadas - miBus");
	
	$paradas_url = $this->Html->url(array("controller" => "Predicciones", "action" => "obtener_paradas_ruta", "ext" => "json"));	
	$recorridos_url = $this->Html->url(array("controller" => "Predicciones", "action" => "obtener_recorridos_realizados_ruta", "ext" => "json"));
	$ruta_coords_ajax = $this->Html->url(array("controller" => "Predicciones", "action" => "obtener_coordenadas_ruta", "ext" => "json"));
	$gps_coords_url = $this->Html->url(array("controller" => "Predicciones", "action" => "obtener_coordenadas_recorrido_realizado", "ext" => "json"));
	
	$base_url = $this->Html->url('/');

?>
<table align="center">
	<tr>
		<td>Ruta:</td>
		<td>
			<select id="id_ruta_id" name="ruta_id" onchange="ruta_cambiada();">			
				<option value="0">[Seleccione Ruta]</option>
				<?php				
					foreach ($todas_rutas as $key => $registro){
						$values = $registro['Ruta'];
						
						if ($id_ruta == $values["id_ruta"]){
							echo "<option value=\"".$values["id_ruta"]."\" selected>(".$values["id_ruta"].") - ".$values["nombre_ruta"]."</option>";
						} else {
							echo "<option value=\"".$values["id_ruta"]."\">(".$values["id_ruta"].") - ".$values["nombre_ruta"]."</option>";
						}
					}
				?>
			</select>
		</td>
		<td>Min Recorrido:</td>
		<td>
			<select id="id_min_recorrido" name="min_recorrido">
				<option value="0" selected>[Seleccione Recorrido]</option>
			</select>
		</td>		
	</tr>
	<tr>
		<td>Min Distancia:</td>
		<td><input type="text" name="min_radio" id="id_min_radio" value="0.0"></td>
		<td colspan="2"><input type="button" id="id_graficar_coords" name="graficar_coords" value="Graficar Coordenadas" onclick="graficar_coordenadas();"></td>
	</tr>
</table>
<table align="center">
	<tr>
		<td>
			<textarea id="id_salida" name="salida" cols="40" rows="30" style="font-size: 8pt;"></textarea>
		</td>
		<td>
			<div id="mapContainer" style="height: 400px; width: 950px;"></div>
		</td>
	</tr>
</table>
<script type="text/javascript" charset="UTF-8" src="http://js.cit.api.here.com/se/2.5.4/jsl.js?with=all"></script>
<script type="text/javascript" charset="UTF-8" src="<?php echo $base_url; ?>js/prediccion_mapas.js"></script>
<script type="text/javascript" charset="UTF-8" src="<?php echo $base_url; ?>js/prediccion_ruta.js"></script>
<script type="text/javascript" id="map_source">
	var ultimo_ruta_id = null;
	var ultimo_recorrido_id = null;
	
	var ruta_coordenadas;
	var coordenadas_gps;
	
	var paradas_posiciones;
	var gps_posiciones;
	var porcentages_ruta;		
	
	//Inicializar mapas...
	iniciar_mapas();
	
	var markersContainer = {
		rutas: new nokia.maps.map.Container(), 
		paradas: new nokia.maps.map.Container(),
		coords: new nokia.maps.map.Container(),
	};
	
	var icon_parada = new nokia.maps.gfx.BitmapImage("<?php echo $base_url; ?>img/parada_3.png", null, 30, 30, 0, 0);
	var icon_coord = new nokia.maps.gfx.BitmapImage("<?php echo $base_url; ?>img/parada_1.png", null, 21, 30, 0, 0);
	var icon_coord2 = new nokia.maps.gfx.BitmapImage("<?php echo $base_url; ?>img/parada_2.png", null, 21, 30, 0, 0);
	
	function limpiar_combobox(combobox){
		var length = combobox.options.length;
		for (i = 0; i < length; i++) {
			combobox.options[i] = null;
		}
		
		combobox.options.length = 0;
	}
	
	function nueva_opcion(valor, texto){
		var extra_opcion = document.createElement('option');
		extra_opcion.text = texto;
		extra_opcion.value = valor;
	
		return extra_opcion;
	}
	
	function establecer_habilitado(habilitado){
		document.getElementById('id_ruta_id').disabled = !habilitado;
		document.getElementById('id_min_recorrido').disabled = !habilitado;
		document.getElementById('id_min_radio').disabled = !habilitado;
		document.getElementById('id_graficar_coords').disabled = !habilitado;		
	}

	function ruta_cambiada(){	
		//Ejecutar Ajax para actualizar lista de recorridos...
		var ruta_id = document.getElementById('id_ruta_id').value;
		
		//Actualiza el contenido del combobox
		$.get("<?php echo $recorridos_url; ?>?id_ruta=" + ruta_id, 
			function(data_recorridos){
				var combo_recorridos = document.getElementById('id_min_recorrido');
				limpiar_combobox(combo_recorridos);
				
				combo_recorridos.add(nueva_opcion(0,"[Seleccione Recorrido]"));
				
				for (var i = 0; i < data_recorridos.length; i++){
					combo_recorridos.add(
						nueva_opcion(data_recorridos[i].id_recorrido_realizado, 
									"(" + data_recorridos[i].id_recorrido_realizado + ") - " + data_recorridos[i].fecha_salida)
					);
				}
				
			});
	}
	
	function graficar_coordenadas(){
		var ruta_id = document.getElementById('id_ruta_id').value;
		var recorrido_id = document.getElementById('id_min_recorrido').value;
		
		if (ruta_id == 0){
			alert("Debe seleccionar ruta");
			return;
		}
		
		if (recorrido_id == 0){
			alert("Debe seleccionar recorrido");
			return;
		}
		
		establecer_habilitado(false);
			
		if (ultimo_ruta_id != ruta_id){
			//Actualizar todo...
			ultimo_ruta_id = ruta_id;
			ultimo_recorrido_id = recorrido_id;
			
			//Recuperar coordenadas de ruta guardadas en server
			$.get("<?php echo $ruta_coords_ajax; ?>?id_ruta=" + ruta_id, ruta_coordenadas_recuperadas);
		} else {
			if ( ultimo_recorrido_id != recorrido_id){
				//Actualizar desde recorrido....
				ultimo_recorrido_id = recorrido_id;
				
				descargar_coordenadas();
			} else {
				//Solo actualizar en base a distancia
				mostrar_coordenadas_filtradas();
			}
		}		
	}
	
	//Funcion que grafica la ruta una vez que se ha calculado....
	var onRouteCalculated = function (observedRouter, key, value) {
		
		if (value == "finished") {
			var routes = observedRouter.getRoutes(),
				route = routes[0],
				waypoints = route.waypoints,
				i, length = waypoints.length;
			
			var lineColor = "#285999";
			
			var linea_ruta = new nokia.maps.map.Polyline(route.shape, {
				pen : new nokia.maps.util.Pen({
					lineWidth: 5, 
					strokeColor: lineColor
				}),
				arrows: new nokia.maps.util.Arrows({
					color: "#FFFFFF"
				})
			});
			
			linea_ruta.set("id_ruta", observedRouter.get("id_ruta"));
			linea_ruta.addListener("mouseover" ,  function(evt) { 
				evt.target.set("pen", new nokia.maps.util.Pen({
					lineWidth: 5, 
					strokeColor: "#F54046"
				}));
				evt.target.set("zIndex", 100);
				map.update(-1, 0);
			});
			linea_ruta.addListener("mouseout" ,  function(evt) {
				evt.target.set("pen", new nokia.maps.util.Pen({
					lineWidth: 5, 
					strokeColor: lineColor
				}));
				evt.target.set("zIndex", 2);
				map.update(-1, 0);
			});
			
			//Agregar la ruta al mapa, quitando la anterior
			map.objects.remove(markersContainer.rutas);
			markersContainer.rutas.objects.clear();
			markersContainer.rutas.objects.add(linea_ruta);
			map.objects.add(markersContainer.rutas);
			
			//Dibujar las paradas
			var waypoints_ayuda_positions = observedRouter.get("waypoints_ayuda_positions");
			var paradas_waypoints = observedRouter.get("paradas_waypoints");
			map.objects.remove(markersContainer.paradas);
			markersContainer.paradas.objects.clear();
			for (i = 0; i < length; i++) {
				if (waypoints_ayuda_positions.indexOf(i) != -1) {
					continue;
				}

				var markerParada = new nokia.maps.map.Marker(waypoints[i].originalPosition, {
					icon: icon_parada,
					anchor: new nokia.maps.util.Point(15, 15)
				});
				markerParada.parada = paradas_waypoints[i];
				
				markersContainer.paradas.objects.add(markerParada);
			}
			map.objects.add(markersContainer.paradas);
			
			//Ahora, descargar las coordenadas GPS...
			descargar_coordenadas();
			
		} else if (value == "failed") {
			alert("Fallo en enrutamiento!");
			
			ultimo_ruta_id = null;
			ultimo_recorrido_id = null;
		}	
	};
	
	function ruta_coordenadas_recuperadas(data_recuperada){
		ruta_coordenadas = data_recuperada;	
		
		//Dibujar la ruta...
		$.get("<?php echo $paradas_url; ?>?id_ruta=" + ultimo_ruta_id, coordenadas_recuperadas);			
	}
	
	function descargar_coordenadas(){
		$.get("<?php echo $gps_coords_url; ?>?min_id_recorrido_realizado=" + ultimo_recorrido_id + "&id_ruta=" + ultimo_ruta_id, 
			function(data_coordenadas_gps){
				coordenadas_gps = data_coordenadas_gps;
				mostrar_coordenadas_filtradas();
			}
		);					
	}
	
	function mostrar_coordenadas_filtradas(){
		if (ruta_coordenadas.length == 0){
			alert("Aun no se han calculado coordenadas para la ruta actual");
			return;
		}
		
		if (coordenadas_gps.length == 0){
			alert("No hay recorridos realizados para la ruta seleccionada");
			return;
		}
		
		paradas_posiciones = puntos_cercanos_coordenadas(current_paradas, ruta_coordenadas);
		gps_posiciones = puntos_cercanos_coordenadas(coordenadas_gps, ruta_coordenadas);
		porcentages_ruta = obtener_porcentajes_ruta(ruta_coordenadas);
		
		//Determinar puntos que estan a distancia mayor del minimo
		var min_distancia = parseFloat(document.getElementById('id_min_radio').value);
		var max_distancia = min_distancia;
		
		//Limpiar los marcadores existentes ....
		map.objects.remove(markersContainer.coords);
		markersContainer.coords.objects.clear();	
		//Crear nuevos marcadores....
		var markerCoord;
		var curr_ico;
		var i;
		for (i = 0; i < gps_posiciones.length; i++){
			if (gps_posiciones[i].distancia > max_distancia){
				max_distancia = gps_posiciones[i].distancia;
			}
			if (gps_posiciones[i].distancia >= min_distancia){
				if (porcentages_ruta[gps_posiciones[i].index] >= PARAMETRO_rechazo_min &&
					porcentages_ruta[gps_posiciones[i].index] <= PARAMETRO_rechazo_max){
					curr_ico = icon_coord;
				} else {
					curr_ico = icon_coord2;
				}
				
				markerCoord = new nokia.maps.map.Marker(
					new nokia.maps.geo.Coordinate(Number(coordenadas_gps[i].latitud), Number(coordenadas_gps[i].longitud)), {
						icon: curr_ico,
						anchor: new nokia.maps.util.Point(10, 29)
					}
				);
				markersContainer.coords.objects.add(markerCoord);
			}	
		}
	
		//Agregar de nuevo...
		map.objects.add(markersContainer.coords);
		
		//Histogram....
		var hist_range = max_distancia + min_distancia + 0.1;
		var hist_bins = 20;
		var hist_values = [];
		var hist_values_inside = [];
		var bin_actual;
		for (i = 0; i < hist_bins; i++){
			hist_values[i] = 0.0;
			hist_values_inside[i] = 0.0;
		}
		for (i = 0; i < gps_posiciones.length; i++){
			bin_actual = Math.floor(((gps_posiciones[i].distancia - min_distancia) / hist_range) * hist_bins);
			hist_values[bin_actual]++;
			if (porcentages_ruta[gps_posiciones[i].index] >= PARAMETRO_rechazo_min &&
				porcentages_ruta[gps_posiciones[i].index] <= PARAMETRO_rechazo_max){
				hist_values_inside[bin_actual]++;
			}
		}
		var hist_output = "";
		var range_start, range_end;
		for (i = 0; i < hist_bins; i++){
			range_start = min_distancia + (i / hist_bins) * hist_range;
			range_end = min_distancia + ((i + 1) / hist_bins) * hist_range;
			hist_output += range_start.toFixed(4) + "\t" + range_end.toFixed(4) + "\t" + 
							hist_values[i] + "\t" + hist_values_inside[i] + "\n";
		}
		document.getElementById('id_salida').value = hist_output;		
		
		establecer_habilitado(true);
	}
</script>